package com.song.NettyTest;

import com.song.api.HelloService;
import com.song.autoscanner.ServiceScan;
import com.song.server.NettyServer;
import com.song.server.RpcServer;
import com.song.transport.CommonSerializer;

/**
 * Netty传输  和  通用序列化接口 Json序列化 和 Kryo序列化
 * 注册完通用接口后
 * 主要是对客户端发送的信息 进行反射调用
 * 实现Nacos在线注册  服务自动注销 和 负载均衡
 * 我们首先需要获得要扫描的包的范围，就需要获取到 ServiceScan 注解的值，而我们前面说过，这个注解是加在启动类上的，那么，我们怎么知道启动类是哪一个呢？答案是通过调用栈。方法的调用和返回是通过方法调用栈来实现的，
 * 当调用一个方法时，该方法入栈，该方法返回时，该方法出站，控制回到栈顶的方法。那么，main 方法一定位于调用栈的最底端，在 ReflectUtils 中，我写了一个 getStackTrace 方法（名字起得不好），用于获取 main 所在的类。
 * 通过 Class 对象的 isAnnotationPresent 方法来判断该类是否有 ServiceScan 注解。如果有，通过startClass.getAnnotation(ServiceScan.class).value(); 获取注解的值。
 *
 * 当获得扫描的范围后，就可以通过ReflectUtil.getClasses(basePackage) 获取到所有的 Class 了，逐个判断是否有 Service 注解，如果有的话，通过反射创建该对象，并且调用 publishService 注册即可。
 */
@ServiceScan//扫描所有类，找到@Service注册
public class NettyTestServer {
    public static void main(String[] args) throws Exception {
//        HelloService helloService = new HelloServiceImpl();
//        ServiceRegistry registry = new DefaultServiceRegistry();
//        registry.register(helloService);//注册通用接口
//        NettyServer server = new NettyServer();
        //server.start(9999);

        //*******先需开启Nacos I:\Download\安装软件\nacos-server-1.3.2\nacos\bin
        //使用Nacos注册
        //HelloService helloService = new HelloServiceImpl();
        //向Nacos注册 服务器的host 和 port
//        NettyServer server = new NettyServer("127.0.0.1", 9998, CommonSerializer.KRYO_SERIALIZER);
//        server.addService(HelloService.class, "hello");
//        server.publishService(HelloService.class);//手动注册服务 启动

        RpcServer server = new NettyServer("127.0.0.1", 9998, CommonSerializer.KRYO_SERIALIZER);
        server.start();
    }
}
